package com.lambda;


import com.lambda.service.MyInterface;
import com.lambda.service.MyInterface02;
import com.lambda.service.impl.MyInterfaceImpl;

/**
 * 函数式接口,只要是函数式接口,就可以用Lambda表达式简化
 * 函数式接口定义: 接口中只有一个未实现的方法,这个接口就叫函数式接口
 *
 *  总结:
 *      1.Lambda表达式  (参数表)  -> {方法体}
 *      2.分辨出你写的接口是否是函数式接口,只要是函数式接口就可以用Lambda简化
 *
 *  最佳实践
 *      调用某个方法传入参数,这个参数实例是一个接口对象,且该接口只有一个方法,就直接用Lambda表达式
 */

public class Lambda {

    public static void main(String[] args) {

        //自己创建实现类的方法,实现加法功能
        MyInterface myInterface = new MyInterfaceImpl();
        int sum = myInterface.sum(1, 2);
        System.out.println(sum);

        //创建匿名实现类
        MyInterface myInterface1 = new MyInterface() {
            public int sum(int i, int j) {
                return i*i + j*j;
            }
        };
        int sum1 = myInterface1.sum(2, 3);
        System.out.println(sum1);

        //Lambda表达式的写法   参数列表 + 箭头 + 返回体
        MyInterface myInterface2 = (int i, int j) -> {
            return i*i + j*j;
        };

        int sum2 = myInterface2.sum(4, 5);
        System.out.println(sum2);

        //Lambda表达式的简化写法
          //1.参数列表中的参数类型可以不写,只写参数名(参数名),参数名字可以随便写   如果接口是无参的,可以只写一个括号()
        //接口带参数的
        MyInterface myInterface3 = (x, z) ->{
            return x*x + z*z;
        };
        int sum3 = myInterface3.sum(6, 7);
        System.out.println(sum3);

        //接口不带参数的
        MyInterface02 myInterface4 = () -> {
            return "World";
        };
        String str = myInterface4.getStr();
        System.out.println(str);


        //Lambda表达式的简化写法
        //2.方法体只有一句话的 {}可以省略
        MyInterface myInterface5 = (i, j) -> i + j;
        int sum4 = myInterface5.sum(7, 8);
        System.out.println(sum4);
    }
}
